import axios from 'axios';
import errorCode from "@/utils/errorCode";
import useInfoStore from '@/stores/modules/use';
import { message } from 'ant-design-vue';
import { useRouter } from 'vue-router';
const router = useRouter();

const { token, loginOut } = useInfoStore();

axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";

// 创建一个axios实例对象
const baseURL = import.meta.env.VITE_APP_BASE_API;
const service = axios.create({
    baseURL: baseURL, // 配置基础地址
    timeout: 10000 // 超时时间-10秒

})

// 请求拦截器
service.interceptors.request.use(
    // 成功执行
    (config) => {
        // 是否需要防止数据重复提交
        // const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
        // console.log(isRepeatSubmit)
        if (token) {
            // 注入token,存放在请求头中
            config.headers["Authorization"] = "Bearer " + getToken();
        }
        // get请求映射params参数
        if (config.method === "get" && config.params) {
            let url = config.url + "?" + tansParams(config.params);
            url = url.slice(0, -1);
            config.params = {};
            config.url = url;
        }
        // if (!isRepeatSubmit && (config.method === "post" || config.method === "put")){
        //     const requestObj = {
        //         url: config.url,
        //         data:
        //             typeof config.data === "object"
        //                 ? JSON.stringify(config.data)
        //                 : config.data,
        //         time: new Date().getTime(),
        //     };
        //     const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
        //     const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
        //     if (requestSize >= limitSize) {
        //         console.warn(
        //             `[${config.url}]: ` +
        //             "请求数据大小超出允许的5M限制，无法进行防重复提交验证。"
        //         );
        //         return config;
        //     }
        // }
        // 返回成功结果
        return config;
    },
    // 失败执行
    (err) => {
        // 终止执行promise,存放err对象, 如果没有错误对象,需要new Error('错误信息')
        return Promise.reject(err);
    }
)

// 响应拦截器
service.interceptors.response.use(
    // 成功执行
    (res) => {
        // 设置状态码
        const code = res.data.code || 200;
        // 获取错误信息
        const msg = errorCode[code] || res.data.msg || errorCode["default"];

        // 二进制数据则直接返回
        const responseType = res.request.responseType;
        if (responseType === "blob" || responseType === "arraybuffer") {
            return res.data;
        }

        // 登录状态过期
        if (code === 401) {
            // 当token改变或者过期了 , 请求拦截器会将错误的token给下一次请求 , 当下一次请求返回401时 , 则清除token , 并跳转到登录页面
            loginOut().then(() => {
                message.error("无效的会话，或者会话已过期，请重新登录。");
                router.push("/login");
            })
            // 当有错误的时候 , 不想重复弹出错误信息 , 所以这里直接返回一个错误对象, 拦截axios 返回的错误
            return Promise.reject(new Error("无效的会话，或者会话已过期，请重新登录。"));
        }
        // 服务器错误
        if (code === 500) {
            message.error(msg);
            return Promise.reject(new Error(msg));
        }
        // 如果是其他的错误
        if (code !== 200) {
            message.error(msg);
            return Promise.reject(new Error(msg));
        }

        return Promise.resolve(res.data);
    },
    // 失败执行
    (err) => {
        // err.mesage为错误信息
        message.error(err.mesage);
        return Promise.reject(err);
    }
)

export default service;